方法的繼承要能發揮真正的威力,必須仰賴多形
子類別的內容包含了父類別的所有內容
由於越下層的類別一定包含了上層的成員變數
所以我們可以使用上層的類別去指向下層的類別
我會拿昨天的Animal類別來做示範
[Day12] 論物件導向三本柱之二(繼承)
像我可能就懶得看所以我還是再打一次騙騙字數
Animal.cs
using System;
namespace Inheritance
{
public abstract class Animal
{
protected string Name;
public virtual void Move()
{
Console.WriteLine("Move");
}
public void GetName()
{
Console.WriteLine($"動物的名字是{Name}");
}
public abstract void Eat();
}
}
Dog.cs
using System;
namespace Inheritance
{
public class Dog : Animal
{
public Dog()
{
Name = "Dog";
}
public void WagTail()
{
Console.WriteLine($"{Name}搖了搖尾巴");
}
public override void Eat()
{
Console.WriteLine($"{Name}吃肉");
}
}
}
Bird.cs
using System;
namespace Inheritance
{
public class Bird:Animal
{
public Bird()
{
Name = "Bird";
}
public override void Move()
{
Console.WriteLine("這樣太危險,我飛太遠");
}
public override void Eat()
{
Console.WriteLine($"{Name}吃蟲");
}
}
}
好了 我們現在有一個父類別Animal
還有兩個繼承他的類別Dog與Bird
同樣的我們今天宣告一隻狗跟一隻鳥
但是我們使用父類別Animal來宣告
Animal Dog = new Dog()
Dog.Eat();
//狗吃肉
Animal Bird = new Bird()
Bird.Eat();
//鳥吃蟲
實際上你宣告的一個Animal 類別的物件
但是你所使用的方法屬性等等都是指向子類別的
也就是未來再抽換實作的時候
可以很靈活
Animal animal = new Dog();
animal.WagTail();
//出錯
奇怪 狗狗類別明明就有搖尾巴的方法
為甚麼不給我用(怒
因Animal類別沒有啊!!!
你所宣告的物件是Animal
我左看右看都看不見Animal有搖尾巴的方法
因此編譯器會報錯也是理所當然的